package dao;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import externaldata.gare.Gare;


public class DaoGare {

	/* ------------------------------------------------ REQUETES PRECOMPILEES */
	private static CallableStatement statementAjouterListe = null;
	private static CallableStatement statementGetGareFromUic = null;
	private static CallableStatement statementGetGareFromDua = null;
	private static CallableStatement statementGetAllGaresWithDua = null;
	private static CallableStatement statementDeleteAllGares = null;
	
	
	static {
		
		try {
			
			statementAjouterListe = DbConnection.getInstance().prepareCall(
					"{call createGare(?, ?, ?)}");
			
			statementGetGareFromUic = DbConnection.getInstance().prepareCall(
					"{call getGareFromUic(?)}");

			statementGetGareFromDua = DbConnection.getInstance().prepareCall(
					"{call getGareFromDua(?)}");

			statementGetAllGaresWithDua = DbConnection.getInstance().prepareCall(
					"{call getAllGaresWithDua()}");

			statementDeleteAllGares = DbConnection.getInstance().prepareCall(
					"{call deleteAllGares()}");
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	

	
	/* -------------------------------------------------- METHODES D'ACCES BD */
	
	public static void ajouterListe(List<Gare> gares) {
		
		for (Gare gare : gares) {
			
			try {
				synchronized (statementAjouterListe) {
					// Ajout des paramètres
					
					// UIC
					statementAjouterListe.setString(1, gare.getUic());
					// Nom
					statementAjouterListe.setString(2, gare.getNom());
					// DUA
					statementAjouterListe.setString(3, gare.getDua());
					
					
					// Exécution
					statementAjouterListe.execute();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static Gare getGareFromUic(String uic) {
		
		Gare resultGare = null;
		
		try {
			ResultSet rs = null;
			
			synchronized (statementGetGareFromUic) {
				statementGetGareFromUic.setString(1, uic);
				
				rs = statementGetGareFromUic.executeQuery();
			}
			
			if(rs != null && rs.last()) {
				if(rs.getRow() == 1) {
					// Attention à l'ordre des champs dans la table
					resultGare = new Gare(rs.getInt("id_gare"), rs.getString("nom"), rs.getString("uic"), rs.getString("dua"));
				}
				else {
					System.err.println("DaoGare.getGareFromUic(" + uic + ") : plusieurs résultats.");
				}
			}
			else {
				System.out.println("DaoGare.getGareFromUic(" + uic + ") : aucun résultat.");
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return resultGare;
	}
	
	public static Gare getGareFromDua(String dua) {
		
		Gare resultGare = null;
		
		try {
			ResultSet rs = null;
			
			synchronized (statementGetGareFromDua) {
				statementGetGareFromDua.setString(1, dua);
				
				rs = statementGetGareFromDua.executeQuery();
			}
			
			if (rs != null && rs.last()) {
				if (rs.getRow() == 1) {
					// Attention à l'ordre des champs dans la table
					resultGare = new Gare(rs.getInt("id_gare"), rs.getString("nom"), rs.getString("uic"), rs.getString("dua"));
				}
				else {
					System.err.println("DaoGare.getGareFromDua(" + dua + ") : plusieurs résultats.");
				}
			}
			else {
				System.out.println("DaoGare.getGareFromDua(" + dua + ") : aucun résultat.");
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return resultGare;
	}
	
	public static List<Gare> getAllGaresWithDua() {
		
		List<Gare> garesWithDua = null;
		
		try {
			ResultSet rs = null;
			
			synchronized (statementGetAllGaresWithDua) {
				rs = statementGetAllGaresWithDua.executeQuery();
			}
			
			if (rs != null) {
				garesWithDua = new ArrayList<Gare>();
				
				while (rs.next()) {
					// Attention à l'ordre des champs dans la table
					garesWithDua.add(new Gare(rs.getInt("id_gare"), rs.getString("nom"), rs.getString("uic"), rs.getString("dua")));
				}
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return garesWithDua;
	}
	
	public static void deleteAllGares() {
		
		try {
			synchronized (statementDeleteAllGares) {
				statementDeleteAllGares.execute();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
